/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package classes;

import bd.Database;
import bd.GenerateSql;

/**
 *
 * @author user
 */
public class Produto {

   private String codigo= "";
   private String codbar= "";
   private String refere= "";
   private String codncm= "";
   private String nome= "";
   private String necf= "";
   private String secao= "";
   private String unidade= "";
   private String grupo= "";
   private String sgrupo= "";
   private String marca= "";
   private String alicota= "";
   private String situacao= "";
   private String fornece= "";
   private String pneto= "";
   private String pcusto= "";
   private String pmedio= "";
   private String pvenda= "";
   private String venda2= "";
   private String margem= "";
   private String icmcom= "";
   private String icmven= "";
   private String frete= "";
   private String dicms= "";
   private String ipi= "";
   private String outros= "";
   private String comisao= "";
   private String desconto= "";
   private String minimo= "";
   private String maximo= "";
   private String pedido= "";
   private String estoque= "";
   private String deposito= "";
   private String ucompra= "";
   private String saldo= "";
   private String eCompra= "";
   private String eVenda= "";
   private String cadastro= "";
   private String dcompra= "";
   private String pvalte= "";
   private String ficha= "";
   private String grupoId= "";
   private String subGrupoId= "";
   private Database bd;
   private String msgErro= "";
   private String sql= "";
   private GenerateSql gSql;

   public Produto(Database bd) {
      this.bd = bd;
      gSql = new GenerateSql(bd);
   }

   public String getCodigo() {
      return codigo;
   }

   public void setCodigo(String codigo) {
      this.codigo = codigo;
   }

   public String getCodbar() {
      return codbar;
   }

   public void setCodbar(String codbar) {
      this.codbar = codbar;
   }

   public String getRefere() {
      return refere;
   }

   public void setRefere(String refere) {
      this.refere = refere;
   }

   public String getCodncm() {
      return codncm;
   }

   public void setCodncm(String codncm) {
      this.codncm = codncm;
   }

   public String getNome() {
      return nome;
   }

   public void setNome(String nome) {
      this.nome = nome;
   }

   public String getNecf() {
      return necf;
   }

   public void setNecf(String necf) {
      this.necf = necf;
   }

   public String getSecao() {
      return secao;
   }

   public void setSecao(String secao) {
      this.secao = secao;
   }

   public String getUnidade() {
      return unidade;
   }

   public void setUnidade(String unidade) {
      this.unidade = unidade;
   }

   public String getGrupo() {
      return grupo;
   }

   public void setGrupo(String grupo) {
      this.grupo = grupo;
   }

   public String getSgrupo() {
      return sgrupo;
   }

   public void setSgrupo(String sgrupo) {
      this.sgrupo = sgrupo;
   }

   public String getMarca() {
      return marca;
   }

   public void setMarca(String marca) {
      this.marca = marca;
   }

   public String getAlicota() {
      return alicota;
   }

   public void setAlicota(String alicota) {
      this.alicota = alicota;
   }

   public String getSituacao() {
      return situacao;
   }

   public void setSituacao(String situacao) {
      this.situacao = situacao;
   }

   public String getFornece() {
      return fornece;
   }

   public void setFornece(String fornece) {
      this.fornece = fornece;
   }

   public String getPneto() {
      return pneto;
   }

   public void setPneto(String pneto) {
      this.pneto = pneto;
   }

   public String getPcusto() {
      return pcusto;
   }

   public void setPcusto(String pcusto) {
      this.pcusto = pcusto;
   }

   public String getPmedio() {
      return pmedio;
   }

   public void setPmedio(String pmedio) {
      this.pmedio = pmedio;
   }

   public String getPvenda() {
      return pvenda;
   }

   public void setPvenda(String pvenda) {
      this.pvenda = pvenda;
   }

   public String getVenda2() {
      return venda2;
   }

   public void setVenda2(String venda2) {
      this.venda2 = venda2;
   }

   public String getMargem() {
      return margem;
   }

   public void setMargem(String margem) {
      this.margem = margem;
   }

   public String getIcmcom() {
      return icmcom;
   }

   public void setIcmcom(String icmcom) {
      this.icmcom = icmcom;
   }

   public String getIcmven() {
      return icmven;
   }

   public void setIcmven(String icmven) {
      this.icmven = icmven;
   }

   public String getFrete() {
      return frete;
   }

   public void setFrete(String frete) {
      this.frete = frete;
   }

   public String getDicms() {
      return dicms;
   }

   public void setDicms(String dicms) {
      this.dicms = dicms;
   }

   public String getIpi() {
      return ipi;
   }

   public void setIpi(String ipi) {
      this.ipi = ipi;
   }

   public String getOutros() {
      return outros;
   }

   public void setOutros(String outros) {
      this.outros = outros;
   }

   public String getComisao() {
      return comisao;
   }

   public void setComisao(String comisao) {
      this.comisao = comisao;
   }

   public String getDesconto() {
      return desconto;
   }

   public void setDesconto(String desconto) {
      this.desconto = desconto;
   }

   public String getMinimo() {
      return minimo;
   }

   public void setMinimo(String minimo) {
      this.minimo = minimo;
   }

   public String getMaximo() {
      return maximo;
   }

   public void setMaximo(String maximo) {
      this.maximo = maximo;
   }

   public String getPedido() {
      return pedido;
   }

   public void setPedido(String pedido) {
      this.pedido = pedido;
   }

   public String getEstoque() {
      return estoque;
   }

   public void setEstoque(String estoque) {
      this.estoque = estoque;
   }

   public String getDeposito() {
      return deposito;
   }

   public void setDeposito(String deposito) {
      this.deposito = deposito;
   }

   public String getUcompra() {
      return ucompra;
   }

   public void setUcompra(String ucompra) {
      this.ucompra = ucompra;
   }

   public String getSaldo() {
      return saldo;
   }

   public void setSaldo(String saldo) {
      this.saldo = saldo;
   }

   public String getEcompra() {
      return eCompra;
   }

   public void setEcompra(String e_compra) {
      this.eCompra = e_compra;
   }

   public String getEvenda() {
      return eVenda;
   }

   public void setEvenda(String e_venda) {
      this.eVenda = e_venda;
   }

   public String getCadastro() {
      return cadastro;
   }

   public void setCadastro(String cadastro) {
      this.cadastro = cadastro;
   }

   public String getDcompra() {
      return dcompra;
   }

   public void setDcompra(String dcompra) {
      this.dcompra = dcompra;
   }

   public String getPvalte() {
      return pvalte;
   }

   public void setPvalte(String pvalte) {
      this.pvalte = pvalte;
   }

   public String getFicha() {
      return ficha;
   }

   public void setFicha(String ficha) {
      this.ficha = ficha;
   }

   public String getMsgErro()
   {
      return msgErro;
   }
   
   public Boolean saveProduto(Boolean autoCommit) 
   {
      String produtoId =java.util.UUID.randomUUID().toString();

      
      String marcaId = saveMarca(autoCommit);
      String unidadeId = saveUnidade(autoCommit);
      String secaoId = saveSecao(autoCommit);
      saveGrupoAndSubGrupo(autoCommit);

     if( necf.length() > 20 )
        necf = necf.substring(0, 19);      
      gSql.prepare();
      gSql.setTable("produto");
      gSql.setCommandType(GenerateSql.CommandType.CMD_INSERT);
      
      gSql.setValue(produtoId, "produto_id");
      gSql.setValue(grupoId, "produto_grupo_produto_id");
      gSql.setValue(subGrupoId, "produto_subgrupo_produto_id");
      gSql.setValue(codigo, "produto_codigo_barras");
      gSql.setValue("", "produto_referencia");
      gSql.setValue(nome, "produto_nome");
      gSql.setValue(necf, "produto_nome_reduzido");
      gSql.setValue(unidadeId, "produto_unidade_medida1");
      gSql.setValue("", "produto_embalagem");
      gSql.setValue(marcaId, "produto_marca_produto_id");
      gSql.setValue(secaoId, "produto_secao_produto_id");
      gSql.setValue(cadastro, "produto_data_cadastro");
      gSql.setValue(pvalte, "produto_data_alteracao");
      gSql.setValue("1", "produto_tipo_produto_id");
      gSql.setValue(minimo, "produto_estoque_minimo");
      //gSql.setValue("", "produto_prazo_reposicao");
      gSql.setValue("1", "produto_empresa_id");
      gSql.setValue("true", "produto_ativo");
      gSql.setValue(maximo, "produto_estoque_maximo");
      if (!gSql.execute(autoCommit)) {
         msgErro = gSql.getMsgErro();
         return false;
      }

      gSql.prepare();
      gSql.setTable("grade");
      
      gSql.setValue(produtoId, "grade_id");
      gSql.setValue(produtoId, "grade_produto_id");
      gSql.setValue("UNICO", "grade_nome");
      gSql.setValue(codigo, "grade_codigo_barras");
      gSql.setValue("", "grade_referencia");
      if (!gSql.execute(autoCommit)) {
         msgErro = gSql.getMsgErro();
         return false;
      }

      if (!saveTributo(autoCommit, produtoId)) {
         return false;
      }
      return true;
   }

   private Boolean savePrecoSaldo(Boolean autoCommit, String id)
   {
      gSql.prepare();
      gSql.setTable("preco_saldo");
      gSql.setCommandType(GenerateSql.CommandType.CMD_INSERT);
 
      gSql.setValue(id, "preco_saldo_grade_id");
      gSql.setValue(frete, "preco_saldo_vlr_frete");
      gSql.setValue(saldo,"preco_saldo_atual");
      gSql.setValue(pcusto,"preco_saldo_vlr_compra");
      //gSql.setValue(pvenda, "preco_saldo_vlr_venda1");
      gSql.setValue(ucompra,"preco_saldo_data_ultima_compra");
      gSql.setValue("1","preco_saldo_almox_id");
      gSql.setValue("","preco_saldo_perc_icms");
      gSql.setValue(id,"preco_saldo_produto_id");
      //gSql.setValue("","preco_saldo_pdv_id");
      if (!gSql.execute(autoCommit)) 
      {
         msgErro = gSql.getMsgErro();
         return false;
      } 
      
      gSql.prepare();
      gSql.setValue(id, "preco_saldo_grade_id");
      gSql.setValue(frete, "preco_saldo_vlr_frete");
      gSql.setValue(saldo,"preco_saldo_atual");
      //gSql.setValue("","preco_saldo_vlr_compra");
      gSql.setValue(pvenda, "preco_saldo_vlr_venda1");
      //gSql.setValue(venda2, "preco_saldo_vlr_venda2");      
      gSql.setValue(ucompra,"preco_saldo_data_ultima_compra");
      //gSql.setValue("","preco_saldo_almox_id");
      gSql.setValue(icmven,"preco_saldo_perc_icms");
      gSql.setValue(id,"preco_saldo_produto_id");
      gSql.setValue("1","preco_saldo_pdv_id");  
      if (!gSql.execute(autoCommit)) 
      {
         msgErro = gSql.getMsgErro();
         return false;
      } 
      
      return true;
   }
   
   private Boolean saveTributo(Boolean autoCommit, String id) 
   {
      String aux;
      
      gSql.prepare();
      gSql.setTable("tributo");
      gSql.setCommandType(GenerateSql.CommandType.CMD_INSERT);
      
      gSql.setValue("","estado_id"); // -> pegar o estado do cadastro de empresa
      gSql.setValue(id,"produto_id"); //  -> da tabela produto
      
      aux = situacao.substring(0,0);
      gSql.setValue(aux,"origem_entrada"); //  -> 1º digito do Campo Situacao da tabela dele
      aux = situacao.substring(0,0)+situacao.substring(1,1);
      gSql.setValue(aux,"cst_entrada"); // -> 2º e 3º digitos do Campo Situacao da tabela dele
      gSql.setValue(aux,"cst_saida"); //  2º e 3º digitos do Campo Situacao da tabela dele
      gSql.setValue(icmcom,"icms_entrada"); //  DOUBLE PRECISION DEFAULT 0, 
      gSql.setValue("100","icms_base_entrada"); //  - > sempre 100 
      gSql.setValue(ipi,"ipi_entrada"); //  -> da tabela dele se tiver 
      if( Util.soLetras(alicota))
      {
         gSql.setValue(alicota.substring(0, 0),"natureza_fiscal_entrada"); //  -> da tabela dele o Campo ALICOTA pegar o primeiro Digito caso so tenha letras, se não tiver so letras =T
         gSql.setValue(alicota.substring(0, 0),"natureza_fiscal_saida"); //  -> da tabela dele o Campo ALICOTA pegar o primeiro Digito caso so tenha letras, se não tiver so letras =T
      }
      else
      {
         gSql.setValue("T","natureza_fiscal_entrada"); //  -> da tabela dele o Campo ALICOTA pegar o primeiro Digito caso so tenha letras, se não tiver so letras =T
         gSql.setValue("T","natureza_fiscal_saida"); //  -> da tabela dele o Campo ALICOTA pegar o primeiro Digito caso so tenha letras, se não tiver so letras =T
       }
      gSql.setValue(icmven,"icms_saida"); //  -> da tabela dele o campo ICMSVEN
      gSql.setValue("100","icms_base_saida"); //  -> sempre 100 se o Campo icms_saida <> 0 
      if (!gSql.execute(autoCommit)) 
      {
         msgErro = gSql.getMsgErro();
         return false;
      }      
      return true;
   }

   private String saveMarca(Boolean autoCommit) 
   {
      sql = "SELECT marca_produto_id FROM marca_produto WHERE marca_produto_nome = '" + this.marca + "'";

      Object tmp = bd.executeScalar(sql);

      if (tmp != null) {
         return tmp.toString();
      }

      gSql.prepare();
      gSql.setTable("marca_produto");
      gSql.setCommandType(GenerateSql.CommandType.CMD_INSERT);
      gSql.setValue(marca, "marca_produto_nome");
      if (gSql.execute(autoCommit)) {
         sql = "SELECT last_value FROM marca_produto_marca_produto_id_seq";
         return bd.executeScalar(sql).toString();
      }
      return "1";
   }

   private String saveSecao(Boolean autoCommit) 
   {
      if( secao.equals("") || secao.equals("null"))
         secao= "GERAL";
      sql = "SELECT secao_produto_id FROM secao_produto WHERE secao_produto_nome = '" + this.secao + "'";

      Object tmp = bd.executeScalar(sql);

      if (tmp != null) {
         return tmp.toString();
      }

      gSql.prepare();
      gSql.setTable("secao_produto");
      gSql.setCommandType(GenerateSql.CommandType.CMD_INSERT);
      gSql.setValue(secao, "secao_produto_nome");
      if (gSql.execute(autoCommit)) {
         sql = "SELECT last_value FROM secao_produto_secao_produto_id_seq";
         return bd.executeScalar(sql).toString();
      }
      return "1";
   }
  
   private String saveUnidade(Boolean autoCommit)
   {
      //Não está errado- hehehhehehheheh
      sql = "SELECT unidade_medida_id FROM unidade_medida WHERE unidade_medida_id = '" + this.unidade + "'";

      Object tmp = bd.executeScalar(sql);

      if (tmp != null) {
         return tmp.toString();
      }

      gSql.prepare();
      gSql.setTable("unidade_medida");
      gSql.setCommandType(GenerateSql.CommandType.CMD_INSERT);
      gSql.setValue(marca, "unidade_medida_nome");
      if (gSql.execute(autoCommit)) {

         return this.unidade;
      }
      return "UND";
   }

   private void   saveGrupoAndSubGrupo(Boolean autoCommit)
   {
      sql = "SELECT grupo_produto_id FROM grupo_produto WHERE grupo_produto_nome = '" + this.grupo + "'";

      Object tmp = bd.executeScalar(sql);

      if (tmp != null) {
         grupoId = tmp.toString();
      } else {
         gSql.prepare();
         gSql.setTable("grupo_produto");
         gSql.setCommandType(GenerateSql.CommandType.CMD_INSERT);
         gSql.setValue(grupo, "grupo_produto_nome");
         gSql.setValue("1", "grupo_produto_empresa_id");
         if (gSql.execute(autoCommit)) {
            sql = "SELECT last_value FROM grupo_produto_grupo_produto_id_seq";
            grupoId = bd.executeScalar(sql).toString();
         }
      }

      sql = "SELECT subgrupo_produto_id FROM subgrupo_produto WHERE subgrupo_produto_nome = '" + sgrupo + "' AND subgrupo_produto_grupo_id = " + grupoId;

      tmp = bd.executeScalar(sql);

      if (tmp != null) {
         subGrupoId = tmp.toString();
      } else {
         gSql.prepare();
         gSql.setTable("subgrupo_produto");
         gSql.setCommandType(GenerateSql.CommandType.CMD_INSERT);
         gSql.setValue(sgrupo, "subgrupo_produto_nome");
         gSql.setValue(grupoId, "subgrupo_produto_grupo_id");
         if (gSql.execute(autoCommit)) {
            sql = "SELECT last_value FROM subgrupo_produto_subgrupo_produto_id_seq";
            subGrupoId = bd.executeScalar(sql).toString();
         }
      }
   }
}
